package com.kotlin.flong.base

/*
 四大函数的使用
 */
fun main(args : Array<String>){

	listLet()

}

fun listApply(){
	var list :ArrayList<String>? = arrayListOf("林青霞","灵儿","喜来乐")
	//list?.add("哈哈")
	//list?.add("林少师")

	//任意函数都有apply扩展 apply参数是一个函数
	//凡是kotln有    T.()->Unit 带接收者的函数字面值
	//apply函数返回值就是调用者本身
	list?.apply {
		add("哈哈")
		add("林少师")
	}?.add("董菲菲")


	set{
		this.name
	}
}


/**
 *let函数,任意对象都有let函数扩展
 *let函数参数也是一个函数
 *函数参数它的参数是调用者它本身
 *let的表达式是函数参数的返回值，就是lambda表达式的值
 */
fun listLet(){
	var list :ArrayList<String>? = arrayListOf("林青霞","灵儿","喜来乐")

	list?.let {
		it.add("辽阔")
		"第一个let"
	}
	println(list)
}


/**
 *with是一个独立的函数,可以在任意地方调用
 *with函数需要接收两个参数
 *第一个参数可以接收任意类型
 *第二个参数是函数参数，并且这个函数参数带接受者的函数字面值,接收者就是第一个参数
 *with函数返回值是第二个函数参数的返回值
 */
fun fwith(){
	var list :ArrayList<String> = arrayListOf("林青霞","灵儿","喜来乐")

	with(list){
		this.add("第一个with")
		"第二个with"
	}
}

/**
 *任意类型都有这个run扩展函数
 *run函数参数是带接收者，接收者是调用者本身
 *run函数的返回值就是函数参数的返回值
 */
fun frun(){
	var list :ArrayList<String> = arrayListOf("林青霞","灵儿","喜来乐")

	list.run{
		this.add("")
		"第一个run"
	}.length //因为最后一个是字符串，所以有length方法

}

/*
 * T.() -> Unit
 * lambda相当于定义在T里面的函数，访问对象里面的字段或方法
 */

fun set(block: Datax.() ->Unit){
	//调用方式
	//方法一
	block(Datax())
	//方法二
	Datax().block()
}

class Datax(){
	var name = "历史"
}





